package 双指针.二分查找;

/**
 * 解题思路：
 * 这题可以使用二分法来做，它要找到第一个错误的版本，可以用二分法缩小寻找的空间，有几个要注意的点：
 * ①mid = left + (right - left) / 2;为了防止溢出
 * ②while循环不能用等号
 * ③如果mid是错误版本那么更新right=mid;而不是right=mid-1;
 * 这是因为如果mid是错误版本，那么mid之后的都是错误版本，mid可能是第一个错误版本，如果是，你还让right=mid-1;
 * 那就相当于错过了第一个错误版本。导致找不到结果
 */
public class 第一个错误的版本_278 {


    //    为了不报错，在这里加上这个方法,这个方法的内部逻辑具体参见Leetcode官网
    boolean isBadVersion(int version) {

        return true;
    }

    public int firstBadVersion(int n) {
        int left = 1;
        int right = n;
        while (left < right) {//这里不能用等号，因为right在某种情况是等于mid，而不是等于mid-1，这样会导致在到达left=right=mid后死循环。
            int mid = left + (right - left) / 2;//防止溢出
            if (isBadVersion(mid)) {
                right = mid;//因为right可能就是第一个错误版本，如果等于mid-1，则可能把第一个错误版本给略过
            } else {
                left = mid + 1;
            }
        }
        return left;//一般情况是left=right后那个值就是第一个错误版本，但是如果只有一个1，且就是错误版本，就需要返回left
    }


}
